package ge.usuarios;
import java.util.ArrayList;

import java.util.List;



import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ge.util.Data;
import ge.util.Validadores;
/**
 * 
 * @author Grupo 8
 *
 */
public class Funcionario {
	private String nome;
	private int matricula;
	private String cpf;
	private String endereco;
	private Data dataAdmissao;
	private Data dataPosse;
	private String telefone;
	private String email;
	private ArrayList<Integer> listaMatriculas = new ArrayList();
	private Validadores valida = new Validadores();
	private String foto;
	private String cargo;
	private List<Integer> todasMatriculas;
	
	
	/**
	 * 
	 * @param nome
	 * Nome do funcionario
	 * @param cpf
	 * CPF digitado no formato XXX.XXX.XXX-XX
	 * @param endereco
	 * @param telefone
	 * Telefone no formato (XX)XXXX-XXXX
	 * @param email
	 * Email valido
	 * @param dataAdmissao
	 * Objeto do tipo data
	 * @param dataPosse
	 * Objeto do tipo data
	 * @throws Exception
	 */
	
	public Funcionario(String nome, String cpf, String endereco, String telefone,String email, Data dataAdmissao, Data dataPosse, String foto, String cargo, List<Integer> todasMatriculas) throws Exception {
		this.todasMatriculas = todasMatriculas;
		if(!(valida.validaNome(nome))){
			throw new Exception("Nome invalido");
		}
		this.nome = nome;
		this.matricula = geraMatricula(todasMatriculas);
		if(!(valida.validaCpf(cpf))){
			throw new Exception("CPF invalido");
		}
		this.cpf = cpf;
		if(!(valida.validaEndereco(endereco))){
			throw new Exception("Endereco invalido");
		}
		this.endereco = endereco;
		this.dataAdmissao = dataAdmissao;
		this.dataPosse = dataPosse;
		if(!(valida.validaTelefone(telefone))){
			throw new Exception ("Formato de telefone invalido");
		}
		this.telefone = telefone;
		if(!(valida.validaEmail(email))){
			throw new Exception("Formato de email invalido");
		}
		if(!(valida.validaNome(cargo))){
			throw new Exception("Nome invalido");
		}
		this.cargo = cargo;
		this.email = email;
		this.foto = foto;
	}

	/**
	 * 
	 * @return O telefone do funcionario
	 */
	public String getTelefone() {
		return telefone;
	}
	/**
	 * 
	 * @param telefone
	 * Telefone do funcionario
	 * @throws Exception 
	 */
	public void setTelefone(String telefone) throws Exception {
		if(!(valida.validaTelefone(telefone))){
			throw new Exception ("Formato de telefone invalido");
		}
		this.telefone = telefone;
	}
	/**
	 * 
	 * @return O nome do funcionario
	 */
	public String getNome() {
		return nome;
	}
	/**
	 * 
	 * @param nome Nome do funcionario
	 * @throws Exception
	 */
	public void setNome(String nome) throws Exception {
		if(!(valida.validaNome(nome))){
			throw new Exception("Nome invalido");
		}
		this.nome = nome;
	}
	/**
	 * 
	 * @return A matricula do funcionario
	 */
	public int getMatricula() {
		return matricula;
	}
	/**
	 * Gera uma nova matricula aleatoriamente
	 */
	public void setMatricula() {
		this.matricula = geraMatricula(todasMatriculas);
	}
/**
 * 
 * @return CPF do funcionario
 */
	public String getCpf() {
		return cpf;
	}
	/**
	 * 
	 * @param cpf
	 * CPF no formato XXX.XXX.XXX-XX
	 * @throws Exception
	 */
	public void setCpf(String cpf) throws Exception {
		if(!(valida.validaCpf(cpf))){
			throw new Exception("CPF invalido");
		}
		this.cpf = cpf;
	}
	/**
	 * 
	 * @return O endereco do funcionario
	 */
	public String getEndereco() {
		return endereco;
	}
	/**
	 * 
	 * @param endereco 
	 * Muda o endereco do funcionario
	 * @throws Exception
	 */
	public void setEndereco(String endereco) throws Exception {
		if(!(valida.validaEndereco(endereco))){
			throw new Exception("Endereco invalido");
		}
		this.endereco = endereco;
	}
	/**
	 * 
	 * @return A data de admissao
	 */
	public Data getDataAdmissao() {
		return dataAdmissao;
	}
	/**
	 * 
	 * @param dataAdmissao
	 * Nova data de admissao
	 * @throws Exception 
	 */
	public void setDataAdmissao(Data dataAdmissao) throws Exception {
		if(dataAdmissao == null){
			throw new Exception();
		}
		this.dataAdmissao = dataAdmissao;
	}
	/**
	 * 
	 * @return A data da posse
	 */
	public Data getDataPosse() {
		return dataPosse;
	}
	/**
	 * 
	 * @param dataPosse
	 * Nova data de posse
	 * @throws Exception 
	 */
	public void setDataPosse(Data dataPosse) throws Exception {
		if(dataPosse == null){
			throw new Exception();
		}
		this.dataPosse = dataPosse;
	}

	private int geraMatricula(List<Integer> todasMatriculas){
		Random rand = new Random();
		int num = rand.nextInt(100000);
		if(todasMatriculas.size() == 0){
			todasMatriculas.add(num);
		}else{
			for(int i = 0; i < todasMatriculas.size(); i++){
				if(todasMatriculas.get(i) == num){
					geraMatricula(todasMatriculas);
				}
			}
		}
		return num;
		
	}
	/**
	 * Muda o endereco de email
	 * @param email
	 * Email valido
	 * @throws Exception
	 */
	public void setEmail(String email) throws Exception{
		if(!(valida.validaEmail(email))){
			throw new Exception("Formato de email invalido");
		}
		this.email = email;
	}
	/**
	 * 
	 * @return O email do funcionario
	 */
	public String getEmail(){
		return email;
	}
	/**
	 * Adiciona um caminho de uma foto
	 * @param caminho
	 * String com o caminho da foto
	 * @throws Exception 
	 */
	public void setFoto(String caminho) throws Exception{
		if(caminho == null){
			throw new Exception();
		}
		this.foto = caminho;
	}
	/**
	 * retorna o caminho da foto
	 * @return Retorna o caminho da foto
	 */
	public String getFoto(){
		return foto;
	}
	/**
	 * Seta o cargo do funcionario
	 * @param cargo
	 * String que representa o cargo do funcionario
	 * @throws Exception
	 * Caso digite um cargo vazio
	 */
	public void setCargo(String cargo) throws Exception{
		if(!(valida.validaNome(cargo))){
			throw new Exception("Cargo invalido");
		}
		this.cargo = cargo;
		
	}
	/**
	 * Retorna o cargo do funcionario
	 * @return Retorna o cargo do funcionario
	 */
	public String getCargo(){
		return cargo;
	}
	
	public String toString(){
		return "Nome: " + nome + " | " + "Cargo: "+ cargo + " | "+ "Matricula: "+ matricula + "\n"; 
		
		
	}
	public String[] fragmentaCpf(){
		String cpf1 = cpf;
		String[] fragmentado = new String[4];
		
		//000.000.000.00
		fragmentado[0] = cpf.substring(0, 3);
		fragmentado[1] = cpf.substring(4, 7);
		fragmentado[2] = cpf.substring(8, 11);
		fragmentado[3] = cpf.substring(12, 13);
		fragmentado[3] += cpf.charAt(cpf.length() -1);
		
		return fragmentado;
		
	}
	public String[] fragmentaTelefone(){
		String[] telefoneFragmentado = new String[3];
		telefoneFragmentado[0] = telefone.substring(1, 3);
		telefoneFragmentado[1] = telefone.substring(4, 8);
		telefoneFragmentado[2] = telefone.substring(9, 12);
		telefoneFragmentado[2] += telefone.charAt(telefone.length() -1);
		return telefoneFragmentado;
	}
	
	
}
